/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI.Relatorio;

import Facade.Facade;
import Objetos.Usuario;
import com.toedter.calendar.JDateChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author celio
 */
public class FluxoCaixa extends JPanel {

    JLabel dataConsulta, total, tTotal, totalPositivo, tTotalPositivo, totalNegativo, tTotalNegativo;
    JButton consultar, imprimir, limpar, consultarTodos;
    JDateChooser tDataConsulta;
    MaskFormatter mascaraData;
    JTable movimentacoes, dias;
    JScrollPane scroller;
    JProgressBar progressImpressao;
    Facade fa;

    public FluxoCaixa(final Usuario usu) {

        JLabel tela = new JLabel("... :::   Fluxo de Caixa   ::: ...");
        tela.setBounds(400, 10, 500, 20);
        add(tela);

        dataConsulta = new JLabel("Data: ");
        total = new JLabel("Saldo: ");
        tTotal = new JLabel(" ");
        totalPositivo = new JLabel("Entrada: ");
        tTotalPositivo = new JLabel(" ");
        totalNegativo = new JLabel("Saída: ");
        tTotalNegativo = new JLabel(" ");
        consultar = new JButton("Filtrar");
        consultarTodos = new JButton("Consultar Todos");
        imprimir = new JButton("Imprimir");
        limpar = new JButton("Limpar");
        

        try {
            mascaraData = new MaskFormatter("##/##/####");
        } catch (ParseException ex) {
            Logger.getLogger(FluxoCaixa.class.getName()).log(Level.SEVERE, null, ex);
        }

        tDataConsulta = new JDateChooser();

        progressImpressao = new JProgressBar();
        progressImpressao.setStringPainted(true);   
        progressImpressao.setMinimum(0);   
        progressImpressao.setMaximum(100);
        progressImpressao.setStringPainted(true); 
        
        tTotalNegativo.setForeground(Color.red);
        tTotalPositivo.setForeground(Color.blue);

        dataConsulta.setBounds(10, 50, 100, 20);
        tDataConsulta.setBounds(60, 50, 100, 20);
        total.setBounds(650, 450, 100, 20);
        tTotal.setBounds(710, 450, 100, 20);
        totalPositivo.setBounds(650, 410, 100, 20);
        tTotalPositivo.setBounds(710, 410, 100, 20);
        totalNegativo.setBounds(650, 430, 100, 20);
        tTotalNegativo.setBounds(710, 430, 100, 20);
      
        consultar.setBounds(350, 50, 100, 20);
        imprimir.setBounds(450, 50, 100, 20);
        limpar.setBounds(550, 50, 100, 20);
        consultarTodos.setBounds(650, 50, 150, 20);
        
        progressImpressao.setBounds(new Rectangle(575,10,400,20));
        progressImpressao.setVisible(false);

        add(dataConsulta);
        add(tDataConsulta);
        add(total);
        add(tTotal);
        add(totalPositivo);
        add(tTotalPositivo);
        add(totalNegativo);
        add(tTotalNegativo);
        add(consultar);
        add(imprimir);
        add(limpar);
        add(consultarTodos);
        add(progressImpressao);

        consultar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                try {
                    remove(scroller);

                } catch (NullPointerException e1) {
                }
                fa = new Facade();
                movimentacoes = fa.listarPorDia_Movimentacao(tDataConsulta.getDate().toLocaleString().substring(0, 10),usu);
                movimentacoes.setFont(new Font("Times New Roman", Font.BOLD, 14));
                if (movimentacoes == null) {
                    JOptionPane.showMessageDialog(null, "Sem movimentação nesse dia!!!");
                } else {
                    scroller = new JScrollPane(movimentacoes, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                    scroller.setBounds(50, 110, 800, 300);
                    add(scroller);
                    try {
                        tTotal.setText(Funcoes.funcoes.calculaTotal(movimentacoes, 2, "0"));
                        tTotalPositivo.setText(Funcoes.funcoes.calculaTotal(movimentacoes, 2, "+"));
                        tTotalNegativo.setText(Funcoes.funcoes.calculaTotal(movimentacoes, 2, "-"));
                    } catch (ParseException ex) {
                        Logger.getLogger(FluxoCaixa.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });

        consultarTodos.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                try {
                    
                    remove(scroller);
                    tTotal.setText("");
                    tTotalPositivo.setText("");
                    tTotalNegativo.setText("");

                } catch (NullPointerException e1) {
                }
                fa = new Facade();
                dias = fa.consultarTodos_Dia(usu);
                dias.setFont(new Font("Times New Roman", Font.BOLD, 14));
                if (dias == null) {
                    JOptionPane.showMessageDialog(null, "Sem movimentações de caixa!!!");
                } else {
                    scroller = new JScrollPane(dias, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                    scroller.setBounds(50, 110, 800, 300);
                    add(scroller);

                }
            }
        });

        imprimir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                progressImpressao.setVisible(true);
                Runnable runImpressao = new Runnable() {

                    @Override
                    public void run() {
                       fa = new Facade();
                try {
                    fa.fluxoCaixa_Relatorio(tDataConsulta.getDate().toLocaleString().substring(0, 10), Funcoes.funcoes.calculaTotal(movimentacoes, 2, "+"), Funcoes.funcoes.calculaTotal(movimentacoes, 2, "-"),usu);
                } catch (NullPointerException ex) {
                   JOptionPane.showMessageDialog(null,"Preencha a data!");
                } catch (ParseException ex) {
                    Logger.getLogger(FluxoCaixa.class.getName()).log(Level.SEVERE, null, ex);
                }
                       progressImpressao.setIndeterminate(false);
                       progressImpressao.setValue(100);}
                };
                
                Runnable runBarra = new Runnable() {
                    @Override
                    public void run() {
                        progressImpressao.setIndeterminate(true);
                    }
                };
                
                Thread threadRelatorio = new Thread(runImpressao);
                Thread threadBarra = new Thread(runBarra);
                
                 try {  
            
                        threadBarra.start();  
                        threadRelatorio.join();  
                        threadRelatorio.start(); 
                        
                        } catch (InterruptedException ex) {  
            
                            System.out.println(ex.getLocalizedMessage());  
        
                        } 

            }
        });

        limpar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });

        setLayout(null);
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(1, Color.DARK_GRAY, Color.DARK_GRAY));
        setSize(800, 800);
        setVisible(true);
        revalidate();
        repaint();
    }

}
